package pl.olap.persistence;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;

import pl.olap.dao.Genre;
import pl.olap.dao.Person;
import pl.olap.dao.Production;

public class Cache {

	private static Cache instance = null;
	private Map<String, Person> personCache = new HashMap<String, Person>();
	private Map<String, Genre> genreCache = new HashMap<String, Genre>();
	private Map<String, Production> productionCache = new HashMap<String, Production>();

	private Cache() {

	}

	public static Cache getInstance() {
		if (instance == null) {
			instance = new Cache();
		}
		return instance;
	}
	
	/** Sprawdza czy podobny obiekt jest juz w cache i go zwraca */
	public Production getProduction(Production p) {
		if (p != null) {
			String key = p.getName().toLowerCase();
			if (productionCache.containsKey(key)) {
				return productionCache.get(key);
			} else {
				return p;
			}
		}
		return null;
	}

	/** Sprawdza czy podobny obiekt jest ju� w cache i go zwraca */
	public Genre getGenre(Genre g) {
		if (g != null) {
			String key = g.getName().toLowerCase();
			if (genreCache.containsKey(key)) {
				return genreCache.get(key);
			} else {
				return g;
			}
		}
		return null;
	}
	
	public void addProductionsToCache(List<Production> productions) {
		if (productions != null) {
			for (Production p : productions) {
				String key = p.getName().toLowerCase();
				if (!productionCache.containsKey(key)) {
					productionCache.put(key, p);
				}
			}
		}
	}

	public void addGenresToCache(List<Genre> genres) {
		if (genres != null) {
			for (Genre g : genres) {
				String key = g.getName().toLowerCase();
				if (!genreCache.containsKey(key)) {
					genreCache.put(key, g);
				}
			}
		}
	}

	/** Sprawdza czy podobny obiekt jest juz w cache i go zwraca */
	public Person getPerson(Person p, Session session) {
		if (p != null) {
			Person per = SaveEntityUtil.getPersonFromDB(p.getFirstName(), p.getLastName(), session);
			if(per == null){
				return p;
			}
			return per;
		}
		return null;
	}
	// public void addPersonsToCache(List<Person> persons) {
	// if (persons != null) {
	// for (Person p : persons) {
	// String key = p.getFirstName().toLowerCase() + "_"
	// + p.getLastName().toLowerCase();
	// if (!personCache.containsKey(key)) {
	// personCache.put(key, p);
	// }
	// }
	// }
	// }
}
